package com.shuang.string4;

public class ReverseWords {

    public String reverseWords(String s) {
        //先将字符串中多余的空格去掉 包括前后多余的和中间多余的
        //将字符串整体进行反转
        //再将每个单词（以一个空格分隔的）进行反转

        //去掉多余空格
        StringBuilder sb = removeSpace(s);

        //将字符串整体反转
        reverse(sb, 0, sb.length() - 1);

        //反转每个单词
        reverseEachWords(sb);

        //返回结果
        return sb.toString();
    }

    //去掉多余空格方法
    public StringBuilder removeSpace(String s) {

        //去除字符串首和尾的空格
        int start = 0;
        int end = s.length() - 1;

        while (s.charAt(start) == ' ') {
            start++;
        }

        while (s.charAt(end) == ' ') {
            end--;
        }

        //拼接字符串并且去掉字符串中间多余的空格 保证每个单词之间有一个空格隔开
        StringBuilder sb = new StringBuilder();

        for (int i = start; i <= end; i++) {

            //拿到字符串里的字符
            char c = s.charAt(i);

            if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
                //把字符拼接到sb中同时去掉多余空格
                sb.append(c);
            }
        }

        return sb;
    }

    //将字符串在区间[start, end]反转
    public void reverse(StringBuilder sb, int start, int end) {

        //交换字符位置
        while (start < end) {

            char temp = sb.charAt(end);
            sb.setCharAt(end, sb.charAt(start));
            sb.setCharAt(start, temp);

            start++;
            end--;
        }
    }

    //将每个单词反转
    public void reverseEachWords(StringBuilder sb) {

        //开始索引指向第一个单词的第一个字符
        int start = 0;
        //结束索引先指向第二个字符 寻找单词最后一个字符位置
        int end = 1;

        int len = sb.length();

        while (start < len) {
            //找到每个单词的空格位置
            while (end < len && sb.charAt(end) != ' ') {
                end++;
            }

            //反转单词
            reverse(sb, start, end - 1);

            //开始索引走到下一个单词的第一个字符
            start = end + 1;
            end = start + 1;
        }
    }
}
